/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup CryptoAsymCipherApi
 * @{
 *
 * @brief 为应用提供非对称加密和解密算法接口。
 *
 * @since 20
 */

/**
 * @file crypto_asym_cipher.h
 *
 * @brief 定义非对称密钥加密API。
 *
 * @library libohcrypto.so
 * @include <CryptoArchitectureKit/crypto_asym_cipher.h>
 * @kit CryptoArchitectureKit
 * @syscap SystemCapability.Security.CryptoFramework
 * @since 20
 */

#ifndef CRYPTO_ASYM_CIPHER_H
#define CRYPTO_ASYM_CIPHER_H

#include "crypto_common.h"
#include "crypto_asym_key.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义非对称加密结构。
 *
 * @since 20
 */
typedef struct OH_CryptoAsymCipher OH_CryptoAsymCipher;

/**
 * @brief 根据给定的算法名称创建非对称加密。
 *
 * @param algoName 用于生成加密的算法名称。\n
 * 例如"RSA|PKCS1_OAEP|SHA384|MGF1_SHA384", "SM2|SM3"。
 * @param ctx 指向非对称加密上下文的指针。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymCipher_Create(const char *algoName, OH_CryptoAsymCipher **ctx);

/**
 * @brief 初始化非对称加密。
 *
 * @param ctx 非对称加密上下文。
 * @param mode 加密模式是加密还是解密。
 * @param key 非对称密钥。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @see OH_CryptoAsymCipher_Final
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymCipher_Init(OH_CryptoAsymCipher *ctx, Crypto_CipherMode mode, OH_CryptoKeyPair *key);

/**
 * @brief 完成非对称加密。
 *
 * @param ctx 非对称加密上下文。
 * @param in 要加密或解密的数据。
 * @param out 最终加密或解密的数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @see OH_CryptoAsymCipher_Init
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoAsymCipher_Final(OH_CryptoAsymCipher *ctx, const Crypto_DataBlob *in,
    Crypto_DataBlob *out);

/**
 * @brief 销毁非对称加密上下文。
 *
 * @param ctx 非对称加密上下文。
 */
void OH_CryptoAsymCipher_Destroy(OH_CryptoAsymCipher *ctx);

/**
 * @brief 定义SM2密文规格结构。
 *
 * @since 20
 */
typedef struct OH_CryptoSm2CiphertextSpec OH_CryptoSm2CiphertextSpec;

/**
 * @brief 定义SM2密文规格项类型。
 *
 * @since 20
 */
typedef enum {
    /** 公钥x，也称为C1x。 */
    CRYPTO_SM2_CIPHERTEXT_C1_X = 0,
    /** 公钥y，也称为C1y。 */
    CRYPTO_SM2_CIPHERTEXT_C1_Y = 1,
    /** 哈希值，也称为C2。 */
    CRYPTO_SM2_CIPHERTEXT_C2 = 2,
    /** 密文数据，也称为C3。 */
    CRYPTO_SM2_CIPHERTEXT_C3 = 3,
} CryptoSm2CiphertextSpec_item;

/**
 * @brief 创建SM2密文规格。
 *
 * @param sm2Ciphertext SM2密文DER格式数据，如果为NULL则创建空的SM2密文规格。
 * @param spec 输出的SM2密文规格。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoSm2CiphertextSpec_Create(Crypto_DataBlob *sm2Ciphertext, OH_CryptoSm2CiphertextSpec **spec);

/**
 * @brief 获取SM2密文规格中的指定项。
 *
 * @param spec SM2密文规格。
 * @param item SM2密文规格项。
 * @param out 输出数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoSm2CiphertextSpec_GetItem(OH_CryptoSm2CiphertextSpec *spec,
    CryptoSm2CiphertextSpec_item item, Crypto_DataBlob *out);

/**
 * @brief 设置SM2密文规格中的指定项。
 *
 * @param spec SM2密文规格。
 * @param item SM2密文规格项。
 * @param in 输入数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoSm2CiphertextSpec_SetItem(OH_CryptoSm2CiphertextSpec *spec,
    CryptoSm2CiphertextSpec_item item, Crypto_DataBlob *in);

/**
 * @brief 将SM2密文规格编码为DER格式密文。
 *
 * @param spec SM2密文规格。
 * @param out 输出数据。
 * @return CRYPTO_SUCCESS：操作成功。\n
 *         CRYPTO_NOT_SUPPORTED：操作不支持。\n
 *         CRYPTO_MEMORY_ERROR：内存错误。\n
 *         CRYPTO_PARAMETER_CHECK_FAILED：参数检查失败。\n
 *         CRYPTO_OPERTION_ERROR：调用三方算法库API出错。
 * @since 20
 */
OH_Crypto_ErrCode OH_CryptoSm2CiphertextSpec_Encode(OH_CryptoSm2CiphertextSpec *spec, Crypto_DataBlob *out);

/**
 * @brief 销毁SM2密文规格。
 *
 * @param spec SM2密文规格。
 * @since 20
 */
void OH_CryptoSm2CiphertextSpec_Destroy(OH_CryptoSm2CiphertextSpec *spec);

#ifdef __cplusplus
}
#endif

#endif /* CRYPTO_ASYM_CIPHER_H */
/** @} */
